package com.imut.lagain.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.imut.lagain.entity.MoodRecord;
import com.imut.lagain.mapper.MoodRecordMapper;
import com.imut.lagain.repository.MoodRecordRepository;
import com.imut.lagain.service.IMoodRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

/**
 * 心情记录服务实现类
 */
@Service
public class MoodRecordServiceImpl extends ServiceImpl<MoodRecordMapper, MoodRecord> implements IMoodRecordService {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MoodRecordServiceImpl.class);
    
    @Autowired
    private MoodRecordRepository moodRecordRepository;
    
    /**
     * 根据用户ID查询心情记录
     * @param userId 用户ID
     * @param page 分页参数
     * @return 心情记录分页列表
     */
    @Override
    public IPage<MoodRecord> findByUserId(Long userId, Page<MoodRecord> page) {
        return moodRecordRepository.findByUserId(userId, page);
    }
    
    /**
     * 根据用户ID和心情类型查询心情记录
     * @param userId 用户ID
     * @param moodType 心情类型
     * @param page 分页参数
     * @return 心情记录分页列表
     */
    @Override
    public IPage<MoodRecord> findByUserIdAndMoodType(Long userId, String moodType, Page<MoodRecord> page) {
        return moodRecordRepository.findByUserIdAndMoodType(userId, moodType, page);
    }
    
    /**
     * 查询指定时间范围内的心情记录
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 分页参数
     * @return 心情记录分页列表
     */
    @Override
    public IPage<MoodRecord> findByUserIdAndTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime, Page<MoodRecord> page) {
        return moodRecordRepository.findByUserIdAndTimeRange(userId, startTime, endTime, page);
    }
    
    /**
     * 查询用户最近的心情记录
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 心情记录列表
     */
    @Override
    public List<MoodRecord> findRecentByUserId(Long userId, Integer limit) {
        return moodRecordRepository.findRecentByUserId(userId, limit);
    }
    
    /**
     * 统计用户心情记录数量
     * @param userId 用户ID
     * @return 心情记录数量
     */
    @Override
    public Long countByUserId(Long userId) {
        return moodRecordRepository.countByUserId(userId);
    }
    
    /**
     * 查询用户今日心情记录
     * @param userId 用户ID
     * @return 心情记录列表
     */
    @Override
    public List<MoodRecord> findTodayByUserId(Long userId) {
        LocalDateTime startOfDay = LocalDateTime.now().with(LocalTime.MIN);
        LocalDateTime endOfDay = LocalDateTime.now().with(LocalTime.MAX);
        return moodRecordRepository.findTodayByUserId(userId, startOfDay, endOfDay);
    }
    
    /**
     * 查询与伴侣分享的心情记录
     * @param userId 用户ID
     * @param page 分页参数
     * @return 心情记录分页列表
     */
    @Override
    public IPage<MoodRecord> findSharedByUserId(Long userId, Page<MoodRecord> page) {
        return moodRecordRepository.findSharedByUserId(userId, page);
    }
    
    /**
     * 创建心情记录
     * @param moodRecord 心情记录信息
     * @return 创建结果
     */
    @Override
    public boolean createMoodRecord(MoodRecord moodRecord) {
        try {
            if (moodRecord.getRecordTime() == null) {
                moodRecord.setRecordTime(LocalDateTime.now());
            }
            moodRecord.setCreateTime(LocalDateTime.now());
            moodRecord.setUpdateTime(LocalDateTime.now());
            return this.save(moodRecord);
        } catch (Exception e) {
            log.error("创建心情记录失败", e);
            return false;
        }
    }
    
    /**
     * 更新心情记录
     * @param moodRecord 心情记录信息
     * @return 更新结果
     */
    @Override
    public boolean updateMoodRecord(MoodRecord moodRecord) {
        try {
            moodRecord.setUpdateTime(LocalDateTime.now());
            return this.updateById(moodRecord);
        } catch (Exception e) {
            log.error("更新心情记录失败", e);
            return false;
        }
    }
    
    /**
     * 删除心情记录
     * @param id 心情记录ID
     * @return 删除结果
     */
    @Override
    public boolean deleteMoodRecord(Long id) {
        try {
            return this.removeById(id);
        } catch (Exception e) {
            log.error("删除心情记录失败", e);
            return false;
        }
    }
}